package atividade;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import dominio.ativacao.FuncaoAtivacao;
import dominio.ativacao.especializacao.FuncaoDegrau;
import dominio.neuronio.especializacao.NeuronioPerceptron;
import dominio.padrao.Padrao;

/**
 * @author Paulo Vitor
 * @author Roberto Su
 * 
 * @description
 *
 *
 */
public class Atividade5 {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		List<Padrao> padroesEntrada = new ArrayList<Padrao>();
		padroesEntrada.add( new Padrao(new double[]{0,0}) );
		padroesEntrada.add( new Padrao(new double[]{0,1}) );
		padroesEntrada.add( new Padrao(new double[]{1,0}) );
		padroesEntrada.add( new Padrao(new double[]{1,1}) );
		
		FuncaoAtivacao fa = new FuncaoDegrau(0.0);
		double bias = new Random().nextDouble();
			
		/* AND */
		double[] saidaDesejadaAND = {0,0,0,1};
		
		NeuronioPerceptron pAND = new NeuronioPerceptron(fa,bias);
		pAND.treinar(padroesEntrada, saidaDesejadaAND);
		
		System.out.println("Simulacao porta AND\n");
		System.out.println("[0,0]: " +  pAND.estimular( padroesEntrada.get(0) ));
		System.out.println("[0,1]: " +  pAND.estimular( padroesEntrada.get(1) ));
		System.out.println("[1,0]: " +  pAND.estimular( padroesEntrada.get(2) ));
		System.out.println("[1,1]: " +  pAND.estimular( padroesEntrada.get(3) ));
		
		/* OR */
		double[] saidaDesejadaOR = {0,1,1,1};
		
		NeuronioPerceptron pOR = new NeuronioPerceptron(fa,bias);
		pOR.treinar(padroesEntrada, saidaDesejadaOR);
		
		System.out.println("Simulacao porta OR\n");
		System.out.println("[0,0]: " +  pOR.estimular( padroesEntrada.get(0) ));
		System.out.println("[0,1]: " +  pOR.estimular( padroesEntrada.get(1) ));
		System.out.println("[1,0]: " +  pOR.estimular( padroesEntrada.get(2) ));
		System.out.println("[1,1]: " +  pOR.estimular( padroesEntrada.get(3) ));
		
		/* NAND */
		double[] saidaDesejadaNAND = {1,1,1,0};
		
		NeuronioPerceptron pNAND = new NeuronioPerceptron(fa,bias);
		pNAND.treinar(padroesEntrada, saidaDesejadaNAND);
		
		System.out.println("Simulacao porta NAND\n");
		System.out.println("[0,0]: " +  pNAND.estimular( padroesEntrada.get(0) ));
		System.out.println("[0,1]: " +  pNAND.estimular( padroesEntrada.get(1) ));
		System.out.println("[1,0]: " +  pNAND.estimular( padroesEntrada.get(2) ));
		System.out.println("[1,1]: " +  pNAND.estimular( padroesEntrada.get(3) ));
		
		/* NOR */
		double[] saidaDesejadaNOR = {1,0,0,0};	
		
		NeuronioPerceptron pNOR = new NeuronioPerceptron(fa,bias);
		pNOR.treinar(padroesEntrada, saidaDesejadaNOR);	
		
		System.out.println("Simulacao porta NOR\n");
		System.out.println("[0,0]: " +  pNOR.estimular( padroesEntrada.get(0) ));
		System.out.println("[0,1]: " +  pNOR.estimular( padroesEntrada.get(1) ));
		System.out.println("[1,0]: " +  pNOR.estimular( padroesEntrada.get(2) ));
		System.out.println("[1,1]: " +  pNOR.estimular( padroesEntrada.get(3) ));
	
	}

}
